package com.peter.util;

import org.apache.ibatis.io.Resources;                    // 引入 MyBatis 提供的资源读取工具类
import org.apache.ibatis.session.SqlSession;              // 引入 MyBatis 的 SqlSession 接口
import org.apache.ibatis.session.SqlSessionFactory;       // 引入 SqlSessionFactory 接口，用于创建 SqlSession 实例
import org.apache.ibatis.session.SqlSessionFactoryBuilder; // 引入 SqlSessionFactoryBuilder 类，用于构建 SqlSessionFactory 实例

import java.io.IOException;
import java.io.InputStream;

/**
 * MyBatis 工具类，用于创建和获取 SqlSession 对象。
 * 通过静态代码块提前构建 SqlSessionFactory，提高效率，方便项目中统一使用。
 */
public class MybatisUtil {

    // 定义静态变量 sqlSessionFactory，用于全局只创建一次
    private static SqlSessionFactory sqlSessionFactory;

    // 使用静态代码块，在类加载时初始化 sqlSessionFactory
    static {
        try {
            // 配置文件路径（位于 resources 根目录下）
            String resource = "mybatis-config.xml";

            // 通过 Resources 工具类加载配置文件为输入流
            InputStream inputStream = Resources.getResourceAsStream(resource);

            // 通过构建器读取配置并创建 SqlSessionFactory
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        } catch (IOException e) {
            // 如果配置文件读取失败，抛出运行时异常终止程序
            throw new RuntimeException(e);
        }
    }

    /**
     * 提供一个静态方法供外部使用，用于获取 SqlSession 实例。
     * SqlSession 提供了执行 SQL 语句的所有方法（select、insert、update、delete）。
     * 默认不自动提交事务，需要手动调用 sqlSession.commit()。
     */
    public static SqlSession getSqlSession() {
        // 打开并返回一个新的 SqlSession 实例
        return sqlSessionFactory.openSession();
    }
}
